MSSQL-Server mit Docker unter Linux

Der Titel hört sich im ersten Moment etwas schräg an – insbesondere wenn man zu den etwas älteren Semestern gehört, die noch die Anfeindungen Microsofts in Richtung Linux kennen gelernt haben. Unter anderem mit Werbesprüchen wie „ein freies Betriebssystem hat nicht nur Vorteile“ – verbunden mit einem Bild welches Piguine als Repräsentanten von Linux zeigte mit nicht ganz passenden Köpfen. Das war 2001 und geworben wurde für Windows 2000. Die Zeiten haben sich geändert und mittlerweile gibt es sogar offizieller Weise ein „Windows Subsystem for Linux“ (WSL) und auch erfreuliche Entwicklungen hin zu einer deutlich brauchbareren (Power-)Shell als es die altgediente command.com bzw. cmd.exe je waren. Das Ganze kommt nicht ganz von ungefähr – mit der Microsoft Azure Cloud mussten Werkzeuge her mit denen man Systeme vernünftig remote administrieren kann – da ist es durchaus legitim einmal zu schauen was bei anderen Betriebssystemen für den Erfolg mit verantwortlich ist.

Nun wird man einwenden, dass man doch unter Linux bereits eine sehr breite Auswahl von relationalen Datenbank-Systemen zur Auswahl hat. Die bekannteste dürfte hier immer noch MySQL bzw. der Nachfolger MariaDB sein. Daneben gibt es auch noch PostgreSQL und auch kommerzielle Varianten wie Oracle laufen unter Linux. Warum also einen MSSQL-Server aufsetzen wollen? – Nun es gibt durchaus Szenarien in denen sich ein derartiges Vorgehen anbietet: Unter anderem wenn man die Hardware-Kosten reduzieren möchte bzw. die Ausgaben für ein MS-Server-Betriebssystem für ein Projekt nicht wirklich sinnvoll sind. Das ist gerade für private Umgebungen in denen man klassischer Weise auf das kostenfreie SQL-Express gesetzt hätte eine brauchbare Alternative. Ein weiterer sinnvoller Einsatzzweck ist die Migration eines bestehenden Systems, hier kann es sinnvoll sein sich vorab einmal eine Spielwiese hinzustellen und mit dieser zu experimentieren. Docker hat sich hierbei bewährt, denn die Container kann man bei Bedarf einfach wegwerfen und neu starten.

Server aufsetzen

Die ersten Schritte sind recht einfach und auch bei Microsoft beschrieben (man benötigt natürlich die Berechtigung Docker-Container zu starten, entweder als root oder durch Eintragen des Users in die Docker-Gruppe):

docker pull mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" \
   -p 1433:1433 --name mein_docker_mssql \
   -d mcr.microsoft.com/mssql/server:2019-latest

Im Wesentlichen ist das nichts Spannendes, es birgt aber einige Fallstricke die man gerne erst einmal übersieht. So sollte man das mit dem starken Passwort durchaus ernst nehmen, nicht nur der Sicherheit wegen, sondern schlichtweg weil der Container sonst nicht hochfährt. Das man die EULA (End User License Agreement) akzeptieren muss sollte sich bei einem kommerziellen Produkt von selbst verstehen.

Es schadet auf alle Fälle nicht nach dem Starten (oder dem Startversuch), einen Blick auf den Container bzw. dessen logs zu werfen:

use@host:~$ docker run -p 1433:1433 -e "ACCEPT_EULA=Y" -e 'SA_PASSWORD=easy' -d mcr.microsoft.com/mssql/server:2019-latest
0c11782410365368a23ab6667d1502a90d5c32ec30e18bc934994677dd07eca8
use@host:~$ docker logs 0c11
SQL Server 2019 will run as non-root by default.
This container is running as user mssql.
To learn more visit https://go.microsoft.com/fwlink/?linkid=2099216.
2020-12-05 00:13:37.00 Server      Setup step is copying system data file 'C:\templatedata\master.mdf' to '/var/opt/mssql/data/master.mdf'.
2020-12-05 00:13:37.06 Server      Did not find an existing master data file /var/opt/mssql/data/master.mdf, copying the missing default master and other system database files. If you have moved the database location, but not moved the database files, startup may fail. To repair: shutdown SQL Server, move the master database to configured location, and restart.
2020-12-05 00:13:37.07 Server      Setup step is copying system data file 'C:\templatedata\mastlog.ldf' to '/var/opt/mssql/data/mastlog.ldf'.
2020-12-05 00:13:37.08 Server      Setup step is copying system data file 'C:\templatedata\model.mdf' to '/var/opt/mssql/data/model.mdf'.
2020-12-05 00:13:37.09 Server      Setup step is copying system data file 'C:\templatedata\modellog.ldf' to '/var/opt/mssql/data/modellog.ldf'.
2020-12-05 00:13:37.10 Server      Setup step is copying system data file 'C:\templatedata\msdbdata.mdf' to '/var/opt/mssql/data/msdbdata.mdf'.
2020-12-05 00:13:37.12 Server      Setup step is copying system data file 'C:\templatedata\msdblog.ldf' to '/var/opt/mssql/data/msdblog.ldf'.
2020-12-05 00:13:37.12 Server      Setup step is FORCE copying system data file 'C:\templatedata\model_replicatedmaster.mdf' to '/var/opt/mssql/data/model_replicatedmaster.mdf'.
2020-12-05 00:13:37.13 Server      Setup step is FORCE copying system data file 'C:\templatedata\model_replicatedmaster.ldf' to '/var/opt/mssql/data/model_replicatedmaster.ldf'.
2020-12-05 00:13:37.13 Server      Setup step is FORCE copying system data file 'C:\templatedata\model_msdbdata.mdf' to '/var/opt/mssql/data/model_msdbdata.mdf'.
2020-12-05 00:13:37.15 Server      Setup step is FORCE copying system data file 'C:\templatedata\model_msdblog.ldf' to '/var/opt/mssql/data/model_msdblog.ldf'.
2020-12-05 00:13:37.24 Server      Microsoft SQL Server 2019 (RTM-CU8) (KB4577194) - 15.0.4073.23 (X64) 
        Sep 23 2020 16:03:08 
        Copyright (C) 2019 Microsoft Corporation
        Developer Edition (64-bit) on Linux (Ubuntu 18.04.5 LTS) <X64>
......
2020-12-05 00:13:39.34 spid9s      Error: 46906, Severity: 16, State: 1.
2020-12-05 00:13:39.34 spid9s      Unable to retrieve registry value 'NodeRole' from Windows registry key 'Software\Microsoft\Microsoft SQL Server\MSSQL\Polybase\Configuration': (null).
2020-12-05 00:13:39.61 spid11s     [2]. Feature Status: PVS: 0. CTR: 0. ConcurrentPFSUpdate: 1.
2020-12-05 00:13:39.61 spid11s     Starting up database 'tempdb'.
2020-12-05 00:13:39.61 spid28s     ERROR: Unable to set system administrator password: Password validation failed. The password does not meet SQL Server password policy requirements because it is too short. The password must be at least 8 characters..
2020-12-05 00:13:39.62 spid28s     An error occurred during server setup. See previous errors for more information.
2020-12-05 00:13:39.62 spid28s     SQL Trace was stopped due to server shutdown. Trace ID = '1'. This is an informational message only; no user action is required.

Wie man sieht: einfach Passwörter taugen leider noch nicht mal zum Ausprobieren und eine Fehlermeldung sieht man im ersten Moment auch nicht, außer dass der Container kurz gestartet wird aber dann auch wieder runter gefahren wird.

Das Portmapping ist Geschmackssache – in den meisten Anleitungen (und daher auch hier) ist es enthalten und es ist sinnvoll wenn man den MSSQL-Server von einem anderen Rechner aus ansprechen möchte, für die rein lokale Entwicklung kann man sich auch die vergebene IPv4-Adresse raussuchen und den Server damit ansprechen.

Hilfsmittel – grafisch unter Windows

Wer bereits Erfahrung mit MSSQL hat, kann jetzt bereits loslegen – als Entwickler oder Admin hat man dann in der Regel schon das SQL Server Management Studio (SSMS) installiert und kann damit den Server direkt ansprechen. Das Werkzeug ist in diesem Bereich durchaus als Gold-Standard zu sehen. Leider läuft es nur unter Windows.

Hilfsmittel – grafisch unter Linux

Viele Entwickler (und auch ich) nutzen zur Datenbank-Administration auch unter Linux HeidiQSL. Das klappt dank Wine unter Linux auch recht unproblematisch (wenn man von einigen kleineren Abstürzen bzw. verbeulten Darstellungen einmal absieht. Leider ist es mir nicht gelungen das Tool dazu zu überreden unter Linux auch MSSQL-Server anzusprechen – unter Windows benötigt man auch die passenden Libraries aber dann geht es wie man es erwarten würde.

Eine derzeit in Entwicklung befindliche Alternative ist Microsoft Azure Data Studio. Dieses gibt es bereits nativ für Linux und es wird wohl in absehbarer Zeit der Nachfolger für das SQL Server Management Studio werden. Noch ist es nicht wirklich ganz ausgreift und bietet nur die grundlegenden Funktionen an. Für erste Gehversuche taugt es aber allemal.

Aktuell gibt es unter anderem einen etwas nervigen Bug: SQL-Statements die man ausführen möchte (man beachte: es handelt sich hierbei um Transact SQL) sollten immer eine Leerzeile am Ende haben – sonst läuft zumindest derzeit das Query bzw. Skript ewig und wird nicht fertig. Ich hoffe das wird bald behoben, es hat mich einige Nerven gekostet.

Hilfsmittel – auf der Commandline unter Linux

Microsoft stellt unter Windows das Kommandozeilen-Werkzeug sqlcmd bereit. Das ist ähnlich mächtig wie man es unter Linux mit dem mysql-Befehl gewohnt ist. Es nativ unter Linux laufen zu lassen ist eine aufwändige Sache und so habe ich das erst einmal bei Seite gelegt. Denn es gibt eine viel einfachere Variante als sich mit den ganzen Abhängigkeiten herum ärgern zu müssen. Man nehme einfach ein fertiges Container-Image.

docker run -it mcr.microsoft.com/mssql-tools

Schon hat man eine vollständige Commandline, Dateien muss man ggf. in den Container hinein kopieren oder mounten, aber für einfache Operationen wie Backup einspielen oder erstellen ist es allemal tauglich. Zumal es den Overhead und einige Lässlichkeiten aus Azure Data Studio einspart.

Fazit

MSSQL-Server unter Linux – ja das geht. Für den ein oder anderen Anwendungs- und Entwicklungsfall ist das auch eine sehr brauchbare Geschichte. Die Tool-Unterstützung unter Linux ist noch ausbaufähig. In einem der nächsten Einträge hier werde ich einmal über einige Erfahrungen in der Entwicklung mit diesem Setup berichten. Es ist sicherlich nicht mein bevorzugtes Setup, aber der ein oder andere Fall gerade im Bereich von reinen Windows-Clients in Kombination mit einem Linux-Servern ist zumindest einmal eine Überlegung wert.